package gui;

import java.util.LinkedList;
import gameManager.GameState;
import gameManager.StateEvent;
import gameManager.StateListener;
import javax.swing.table.AbstractTableModel;

public class DominoGameTableModel extends AbstractTableModel implements StateListener { 
	
    private static int[][] leftIndexes = {
		{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
		{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,46,-1},
		{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,45,-1},
		{-1,18,17,16,-1, 4, 3, 2,-1,-1,-1,-1,-1,44,-1},
		{-1,19,-1,15,-1, 5,-1, 1,-1,-1,-1,-1,-1,43,-1},
		{-1,20,-1,14,-1, 6,-1, 0,-1,-1,-1,-1,-1,42,-1},
		{-1,21,-1,13,-1, 7,-1,-1,-1,-1,-1,-1,-1,41,-1},
		{-1,22,-1,12,-1, 8,-1,-1,-1,-1,-1,-1,-1,40,-1},
		{-1,23,-1,11,10, 9,-1,-1,-1,-1,-1,-1,-1,39,-1},
		{-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,38,-1},
		{-1,25,26,27,28,29,30,31,32,33,34,35,36,37,-1},
		{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}};
	
    private static int [][] rightIndexes = {
		{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
		{-1,37,36,35,34,33,32,31,30,29,28,27,26,25,-1},
		{-1,38,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,24,-1},
		{-1,39,-1,-1,-1,-1,-1,-1,-1, 9,10,11,-1,23,-1},
		{-1,40,-1,-1,-1,-1,-1,-1,-1, 8,-1,12,-1,22,-1},
		{-1,41,-1,-1,-1,-1,-1,-1,-1, 7,-1,13,-1,21,-1}, 
		{-1,42,-1,-1,-1,-1,-1, 0,-1, 6,-1,14,-1,20,-1}, 
		{-1,43,-1,-1,-1,-1,-1, 1,-1, 5,-1,15,-1,19,-1}, 
		{-1,44,-1,-1,-1,-1,-1, 2, 3, 4,-1,16,17,18,-1},  
		{-1,45,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
		{-1,46,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
		{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}
		};


    private GameState gameState;
	
    public DominoGameTableModel(GameState gameState) {
        if(gameState == null){
            throw new NullPointerException("Game state can't be null");
        }
        this.gameState = gameState;
        gameState.addGameListener(this);
    }

    @Override
    public int getColumnCount() {
        return Properties.GAME_WIDTH;
    }

    @Override    
    public int getRowCount() {
        return Properties.GAME_HEIGHT;
    }

    @Override
    public Object getValueAt(int row, int col) {
    	LinkedList<Integer> left = gameState.getNumbersPlayedLeft();
    	LinkedList<Integer> right = gameState.getNumbersPlayedRight();
    	int leftSize = left.size();
    	int rightSize = right.size();
    		
    	if(leftIndexes[row][col] != -1 &&  leftIndexes[row][col] < leftSize){
            return new Integer(left.get(leftIndexes[row][col]));
        }
    	
    	if(rightIndexes[row][col] != -1 &&  rightIndexes[row][col] < rightSize){
            return new Integer(right.get(rightIndexes[row][col]) + 7);
        }
    	
    	if( leftIndexes[row][col] == leftSize) {
            return new Integer(-2);
    	}
    	
    	if( rightIndexes[row][col] == rightSize) {
            return new Integer(-2);
    	}
    	
    	return new Integer(-1);
    }
    
    public boolean isLeft(int row, int col) {
    	return  leftIndexes[row][col] == gameState.getNumbersPlayedLeft().size();
    }
    
    public boolean isRight(int row, int col) {
    	return  rightIndexes[row][col] == gameState.getNumbersPlayedRight().size();
    }

    @Override
    public void stateChanged(StateEvent event) {
        fireTableDataChanged();	
    }
}
